/**
 * 
 */
package br.com.consultsystems.negocio.impl.financeiro;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import br.com.consultsystems.dominio.cadastro.Condominio;
import br.com.consultsystems.dominio.financeiro.Balancete;
import br.com.consultsystems.dominio.tipos.ParametrosChave;
import br.com.consultsystems.dominio.tipos.StatusFinanceiro;
import br.com.consultsystems.negocio.spec.financeiro.BalanceteNegocio;
import br.com.consultsystems.persistencia.spec.cadastro.CondominioPersistencia;
import br.com.consultsystems.persistencia.spec.configuracao.ParametrosPersistencia;
import br.com.consultsystems.persistencia.spec.financeiro.BalancetePersistencia;

/**
 * @author Moralles
 *
 */
@Stateless(name = "balanceteNegocio")
public class BalanceteNegocioImpl implements BalanceteNegocio {

	private static final Logger LOG = Logger.getLogger(BalanceteNegocioImpl.class);
	
	@EJB
	private BalancetePersistencia balancetePersistencia;

	@EJB
	private CondominioPersistencia condominioPersistencia;
	
	@EJB
	private ParametrosPersistencia parametrosPersistencia;
	
	@Override
	public Balancete merge(Balancete t) throws Exception {
		return balancetePersistencia.merge(t);
	}

	@Override
	public Balancete retrieve(Long id) throws Exception {
		return null;
	}

	@Override
	public void remove(Balancete t) throws Exception {
		t = this.merge(t);
		balancetePersistencia.remove(t);
	}

	@Override
	public void refresh(Balancete t) throws Exception {
		balancetePersistencia.refresh(t);
	}

	@Override
	public List<Balancete> retrieveAll() throws Exception {
		return balancetePersistencia.retrieveAll();
	}

	@Override
	public List<Balancete> retrieveByFilter(String nomeCondominio) throws Exception {
		return balancetePersistencia.retrieveByNomeCondominio(nomeCondominio);
	}

	@Override
	public List<Balancete> retrieveByIdCondominio(Long idCondominio) {
		
		Condominio condominio = condominioPersistencia.retrieve(idCondominio);
		List<Balancete> balancetes = balancetePersistencia.retrieveByIdCondominio(idCondominio);
		
		String valueDiasFechamento = null;
		String valueGerarNDatabases = null;
		
		try {
			valueDiasFechamento = parametrosPersistencia.retrieveByChave(ParametrosChave.DIASFECHAMENTO);
			valueGerarNDatabases = parametrosPersistencia.retrieveByChave(ParametrosChave.GERARNDATABASES);
			if(valueDiasFechamento != null && valueGerarNDatabases != null) {
				Integer diasFechamento = Integer.parseInt(valueDiasFechamento);
				Integer gerarNDatabases  = Integer.parseInt(valueGerarNDatabases);

				
				if(balancetes.size() < gerarNDatabases) {

					Calendar proximaDataBase = new GregorianCalendar();
					proximaDataBase.add(Calendar.DATE, diasFechamento);

					Calendar proximaDataFechamento = new GregorianCalendar();
					proximaDataFechamento.set(Calendar.DATE, condominio.getDiaVencimento());

					/*  
					 * A data do próximo fechamento é gerada somente com o dia do vencimento
					 * A data base do fechamento é a próxima data depois da dataAtual + diasFechamento
					 * Enquanto a dataBase form maior que a próxima data de fechamento, soma 1 mes
					 * */
					while(proximaDataBase.after(proximaDataFechamento)) {
						proximaDataFechamento.add(Calendar.MONTH, 1);
					}
					
					/* Gera a data até 12 registros */
					for (int i=0; i < gerarNDatabases; i++) {
						if(i >= balancetes.size()) {
							Balancete balancete = new Balancete();
							balancete.setCondominio(condominio);
							balancete.setDataVencimento(proximaDataFechamento.getTime());
							balancete.setStatus(StatusFinanceiro.ABERTO);
							balancete = balancetePersistencia.merge(balancete);
							balancetes.add(balancete);
						}
						proximaDataFechamento.add(Calendar.MONTH, 1);
					}
				}
			} 
		} catch (Exception e) {
			LOG.error(e);
		}
		
		return balancetes;
	}

}
